package com.ybear.ybutils.utils;

import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import static com.ybear.ybutils.utils.SysUtil.getPackageInfo;

/**
 * App常用工具类
 * @see #getAppName(Context)
 * @see #getVerName(Context)
 * @see #getVerCode(Context)
 * @see #getSdkVer()
 */
public class AppUtil {
    /**
     * 获取app名称
     * @param context       上下文
     * @return              返回
     */
    @NonNull
    public static String getAppName(@NonNull Context context) {
        try {
            return ResUtil.getString( context, "app_name" );
        }catch (Exception e) {
            e.printStackTrace();
        }
        return "App";
    }

    /**
     * 获取版本名称
     * @param mContext  上下文
     * @return          返回版本名称
     */
    @Nullable
    public static String getVerName(@NonNull Context mContext) {
        try {
            PackageInfo pi = getPackageInfo(mContext);
            return pi == null ? null : pi.versionName;
        }catch (NullPointerException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取版本代码
     * @param mContext  上下文
     * @return          返回版本代码
     */
    public static long getVerCode(@NonNull Context mContext) {
        try {
            PackageInfo pi = getPackageInfo(mContext);
            if( pi == null ) return 0L;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                return pi.getLongVersionCode();
            } else {
                return pi.versionCode;
            }
        }catch (NullPointerException e) {
            e.printStackTrace();
        }
        return 0L;
    }

    /**
     * 获取当前SDK版本
     * @return  ver
     */
    public static int getSdkVer() {
        return Build.VERSION.SDK_INT;
    }

    /**
     * 获取包名
     * @param mContext  上下文
     * @return          包名
     */
    public static String getPackageName(@NonNull Context mContext) {
        PackageInfo pi = getPackageInfo(mContext);
        if( pi == null ) throw new NullPointerException("Get Package Name Error.");
        return pi.packageName;
    }

    /**
     * 获取AndroidManifest中指定的meta-data
     * @param context   上下文
     * @param key       meta-data的key
     * @return          对应的val
     */
    @Nullable
    public static String getMetaDataForString(@NonNull Context context, @NonNull String key) {
        Bundle b = getMetaDataBundle(context);
        return b == null ? null : b.getString( key );
    }
    public static int getMetaDataForInt(@NonNull Context context, @NonNull String key) {
        Bundle b = getMetaDataBundle(context);
        return b == null ? 0 : b.getInt( key );
    }
    @Nullable
    public static Bundle getMetaDataBundle(@NonNull Context context) {
        try {
            PackageManager pm = context.getPackageManager();
            ApplicationInfo ai;
            if( pm == null ) return null;
            ai = pm.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
            return ai.metaData;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

}
